home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / smail-3.1.28 / pd / sdbm / dba.c next >
Encoding:
C/C++ Source or Header  |  1992-05-12  |  1.3 KB  |  91 lines

  1. /* @(#)pd/sdbm/dba.c    1.1 5/12/92 %U&% */
  2. /*
  3.  * dba    dbm analysis/recovery
  4.  */
  5.  
  6. #include "defs.h"
  7. #include "sdbm.h"
  8. #include <stdio.h>
  9. #ifdef UNIX_BSD
  10. #include <sys/file.h>
  11. #else
  12. #include <fcntl.h>
  13. #endif
  14.  
  15. char *progname;
  16. extern void oops();
  17.  
  18. int
  19. main(argc, argv)
  20. char **argv;
  21. {
  22.     int n;
  23.     char *p;
  24.     char *name;
  25.     int pagf;
  26.  
  27.     progname = argv[0];
  28.  
  29.     if (p = argv[1]) {
  30.         name = (char *) malloc((n = strlen(p)) + 5);
  31.         strcpy(name, p);
  32.         strcpy(name + n, ".pag");
  33.  
  34.         if ((pagf = open(name, O_RDONLY)) < 0)
  35.             oops("cannot open %s.", name);
  36.  
  37.         sdump(pagf);
  38.     }
  39.     else
  40.         oops("usage: %s dbname", progname);
  41.  
  42.     return 0;
  43. }
  44.  
  45. sdump(pagf)
  46. int pagf;
  47. {
  48.     register b;
  49.     register n = 0;
  50.     register t = 0;
  51.     register o = 0;
  52.     register e;
  53.     char pag[PBLKSIZ];
  54.  
  55.     while ((b = read(pagf, pag, PBLKSIZ)) > 0) {
  56.         printf("#%d: ", n);
  57.         if (!okpage(pag))
  58.             printf("bad\n");
  59.         else {
  60.             printf("ok. ");
  61.             if (!(e = pagestat(pag)))
  62.                 o++;
  63.             else
  64.                 t += e;
  65.         }
  66.         n++;
  67.     }
  68.  
  69.     if (b == 0)
  70.         printf("%d pages (%d holes):  %d entries\n", n, o, t);
  71.     else
  72.         oops("read failed: block %d", n);
  73. }
  74.  
  75. pagestat(pag)
  76. char *pag;
  77. {
  78.     register n;
  79.     register free;
  80.     register short *ino = (short *) pag;
  81.  
  82.     if (!(n = ino[0]))
  83.         printf("no entries.\n");
  84.     else {
  85.         free = ino[n] - (n + 1) * sizeof(short);
  86.         printf("%3d entries %2d%% used free %d.\n",
  87.                n / 2, ((PBLKSIZ - free) * 100) / PBLKSIZ, free);
  88.     }
  89.     return n / 2;
  90. }
  91.